package ui;

import java.awt.Color;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.uqbar.arena.actions.MessageSend;
import org.uqbar.arena.layout.ColumnLayout;
import org.uqbar.arena.layout.HorizontalLayout;
import org.uqbar.arena.layout.VerticalLayout;
import org.uqbar.arena.widgets.Button;
import org.uqbar.arena.widgets.Label;
import org.uqbar.arena.widgets.List;
import org.uqbar.arena.widgets.Panel;
import org.uqbar.arena.widgets.SWTControlWidget;
import org.uqbar.arena.widgets.Selector;
import org.uqbar.arena.widgets.TextBox;
import org.uqbar.arena.windows.SimpleWindow;
import org.uqbar.arena.windows.WindowOwner;
import org.uqbar.lacar.ui.model.Action;

import com.uqbar.commons.ReflectionUtils;

import applicationModels.Juego;
import applicationModels.Maceta;

import dominio.*;
import exceptions.GameOver;

/**
 * 
 * @author MLinares & MEiroa
 * @category Programacion de IU 1Q2013
 */
public class PlantasVsZombiesWindow extends SimpleWindow<Juego> {
	/**
	 * Asigna el object model de la ventana principal Se utiliza patron
	 * Singleton para asegurar unicidad del objeto juego Recordar que Juego hace
	 * de Application Model.
	 * 
	 * @param parent
	 */
	public PlantasVsZombiesWindow(WindowOwner parent) {
		super(parent, Juego.getInstance());
	}

	private static final long serialVersionUID = 1L;

	/**
	 * Metodo principal
	 * 
	 * 
	 * Genera el panel principal y activa la generacion de los paneles
	 * restantes.
	 */
	@Override
	protected void createMainTemplate(Panel mainPanel) {
		this.setTitle("Plantas vs Zombies");
		// mainPanel.setLayout(new HorizontalLayout());
		super.createMainTemplate(mainPanel);

		Panel juegoPanel = new Panel(mainPanel);
		juegoPanel.setLayout(new HorizontalLayout());

		// Parde del jardin
		this.createLeftPanel(juegoPanel);

		// Parte de zombies
		this.createRightPanel(juegoPanel);

	}

	/**
	 * Genera el panel Izquierdo, hace de contenedor para los botones, el jardin
	 * y el plantado de plantas
	 * 
	 * @param mainPanel
	 */
	protected void createLeftPanel(Panel mainPanel) {
		Panel panel = new Panel(mainPanel);
		panel.setLayout(new VerticalLayout());

		this.createButtons(panel);
		this.createGardenPanel(panel);
		this.createPlantsPanel(panel);
	}

	/**
	 * Genera el panel donde se realiza el plantado de plantas
	 * 
	 * @param mainPanel
	 */
	private void createPlantsPanel(Panel mainPanel) {
		Panel panel = new Panel(mainPanel);
		panel.setLayout(new VerticalLayout());

		Panel titulo = new Panel(panel);
		titulo.setLayout(new HorizontalLayout());

		new Label(titulo).setText("Plantas ").setForeground(Color.GREEN.darker()).setFontSize(15);
		new Label(titulo).setText(" Elige la planta");

		this.crearPanelPlantar(panel);
	}

	/**
	 * Se describe el panel donde se plantan las plantas y sus componentes
	 * 
	 * @param mainPanel
	 */
	protected void crearPanelPlantar(Panel mainPanel) {
		Panel panel = new Panel(mainPanel);
		panel.setLayout(new HorizontalLayout());

		new Label(panel).setText("Planta: ");

		// plantasDisponibles son todas las plantas de los jardines zen
		Selector<Planta> elegirPlanta = new Selector<Planta>(panel);
		elegirPlanta.setWidth(220);
		elegirPlanta.bindItemsToProperty("plantasDisponibles");
		elegirPlanta.bindValueToProperty("plantaPlantar");
	}

	/**
	 * Genera el panel de los botones de acceso con sus respctivos componentes y
	 * comportamiento
	 * 
	 * @param mainPanel
	 */
	private void createButtons(Panel mainPanel) {
		Panel panel = new Panel(mainPanel);
		panel.setLayout(new HorizontalLayout());

		new Button(panel).setCaption("Ir al Jardin Zen").onClick(new MessageSend(this, "abrirJardinZen"));

		new Button(panel).setCaption("Reiniciar").onClick(new MessageSend(this, "abrirDialogRestart"));

		new Button(panel).setCaption("Almanaque").onClick(new MessageSend(this, "abrirAlmanaque"));
	}

	/**
	 * Genera el panel derecho, funciona de contenedor
	 * 
	 * @param mainPanel
	 */
	protected void createRightPanel(Panel mainPanel) {
		Panel panel = new Panel(mainPanel);
		panel.setLayout(new VerticalLayout());

		this.createInfoUsuarioPanel(panel);
		this.createZombiePanel(panel);
		this.createLogPanel(panel);
	}

	/**
	 * El panel del log, en el se crea el panel donde se notificaran al usuario
	 * de los eventos ocurridos ene l juego
	 * 
	 * @param mainPanel
	 */
	private void createLogPanel(Panel mainPanel) {
		Panel panelTitulo = new Panel(mainPanel).setLayout(new HorizontalLayout());
		new Label(panelTitulo).setText("Eventos").setFontSize(13).setForeground(Color.DARK_GRAY);
		Panel panelLog = new Panel(mainPanel).setLayout(new HorizontalLayout());

		new List<String>(panelLog, "mensajesLog").setHeigth(300).setWidth(300);

		/*
		 * Selector<String> log = new Selector<String>(panelLog);
		 * log.setWidth(310); log.setHeigth(100);
		 * log.bindItemsToProperty("mensajes2");
		 */
		// new
		// Label(panelLog).setForeground(Color.YELLOW).setBackground(Color.BLACK).setWidth(400).setHeigth(240)
		// .bindValueToProperty("mensaje");
		/**
		 * new SWTControlWidget(panelLog) {
		 * 
		 * @Override protected void createSWTControl(Composite container) {
		 *           Shell shell1 = new Shell (display); Label label = new Label
		 *           (shell, SWT.BORDER); label.setImage (image); Display
		 *           shell2= new Display(); Image image = new Image(shell,
		 *           "/home/mae-ubu1004.peashooter.jpg");
		 *           org.eclipse.swt.widgets.Label label = new
		 *           org.eclipse.swt.widgets.Label(shell, SWT.NONE);
		 * 
		 *           label.setImage( image );
		 * 
		 *           } };
		 **/

	}

	/**
	 * Crea el panel donde estan los componentes para elegir con que zombie
	 * atacar
	 * 
	 * @param mainPanel
	 */
	private void createZombiePanel(Panel mainPanel) {
		// Titulo
		Panel panelTitulo = new Panel(mainPanel).setLayout(new HorizontalLayout());
		new Label(panelTitulo).setText("Zombies").setFontSize(15).setForeground(Color.RED);

		Panel panel = new Panel(mainPanel).setLayout(new HorizontalLayout());

		new Label(panel).setText("Zombie: ");

		// Seleccionar un zombie de todos los posibles
		Selector<Zombie> chooseZombie = new Selector<Zombie>(panel);
		chooseZombie.bindItemsToProperty("zombies");
		chooseZombie.bindValueToProperty("zombieAtacante");

		// Fila en la que queres atacar
		new Label(panel).setText("Fila: ");

		// Elegir una fila disponible para atacar
		Selector<Integer> fila = new Selector<Integer>(panel);
		fila.bindItemsToProperty("nrosDeFila");
		fila.bindValueToProperty("filaParaAtacar");

		Panel panelAtacar = new Panel(mainPanel).setLayout(new HorizontalLayout());

		Button atacar = new Button(panelAtacar);
		atacar.setCaption("Atacar");
		atacar.onClick(new MessageSend(this.getModelObject(), "pelear"));
	}

	/**
	 * Crea el panel donde se muestran datos del jugador
	 * 
	 * @param mainPanel
	 */
	private void createInfoUsuarioPanel(Panel mainPanel) {
		// Agregandolo al mainPanel directamente queda centrado
		new Label(mainPanel).setText("Recursos: ").setFontSize(15).setForeground(Color.BLUE).setWidth(100);
		new Label(mainPanel).bindValueToProperty("usuario.puntos");
	}

	/**
	 * Metodo para crear el panel donde se vera el jardin
	 * 
	 * @param mainPanel
	 */
	protected void createGardenPanel(Panel mainPanel) {
		Panel elJardin = new Panel(mainPanel);
		elJardin.setLayout(new HorizontalLayout());

		// Titulo
		new Label(mainPanel).setText("Jardin").setFontSize(15).setForeground(Color.GREEN.darker());

		Jardin jardin = this.getModelObject().getElJardin();
		this.createGardenGrid(mainPanel, 800, 400, jardin.getHeight(), jardin.getWidth());
	}

	protected void createGardenGrid(Panel mainPanel, int width, int height, int filas, int casilleros) {
		Panel tableJardin = new Panel(mainPanel);
		// +1 para poner la columna con el numero de filas
		// +1 para poner el boton del zombie que ataca la fila
		tableJardin.setLayout(new ColumnLayout(casilleros + 1));

		this.describeGardensGrid(tableJardin, filas, casilleros);
	}

	protected void describeGardensGrid(Panel mainPanel, int filas, int casilleros) {
		final int WIDTH_CASI = 186;

		// Muestra el numero de casillero
		new Label(mainPanel).setText("");
		for (int h = 0; h < casilleros; h++) {
			Panel p = new Panel(mainPanel);
			p.setLayout(new HorizontalLayout());
			new Label(p).setText("" + (h + 1)).setWidth(WIDTH_CASI);
		}
		// new Label(mainPanel).setText("");

		// Mostrar los casilleros
		for (int i = 0; i < filas; i++) {
			// Muestra el numero de fila
			new Label(mainPanel).setText("" + (i + 1));

			for (int j = 0; j < casilleros; j++) {
				Casillero casillero = this.getModelObject().getCasillero(i, j);

				Maceta maceta = new Maceta(this.getModelObject(), casillero);

				Panel casilla = new Panel(mainPanel, casillero);

				Color backgroundColor = this.getModelObject().getElJardin().getFilas().get(i).getColor();

				Button control = new Button(casilla);
				control.setWidth(WIDTH_CASI);
				control.setHeigth(20);
				control.setCaption("des/plantar");
				control.onClick(new MessageSend(maceta, "clickMaceta"));
				control.setBackground(backgroundColor);

				Label ocupante = new Label(casilla);
				// ocupante.setWidth(WIDTH_CASI);
				ocupante.setHeigth(40);
				ocupante.bindValueToProperty("ocupante");
				ocupante.setBackground(backgroundColor);
			}

			/*
			 * new Button(mainPanel).setCaption("<-- Mandar ZOMBIE")
			 * .onClick(new MessageSend(this, "pelear"));
			 */
		}
	}

	public void pelear() {
		this.getModelObject().pelear();
	}

	public void abrirJardinZen() {
		new JardinZenTerrestreWindow(this).open();
	}

	public void abrirAlmanaque() {
		new AlmanaqueWindow(this).open();
	}

	public void abrirDialogRestart() {
		new DialogWindowRestart(this).open();
	}

	public void abrirDerrotaWindow() {
		new DerrotaWindow(this).open();
	}

	@Override
	protected void addActions(Panel actionsPanel) {
	}

	@Override
	protected void createFormPanel(Panel mainPanel) {
	}

}
